---
--- Created by Administrator.
--- DateTime: 2025/2/22 17:51
---
-- 定义常量
local BUFF_ID = TUNING.ENTITY_LIST.FANGSHUI_BUFF.id  -- 防水buff的唯一ID
local TIMER_NAME = BUFF_ID.."_hover"                 -- 计时器名称
local TASK_ID = BUFF_ID.."_task"                     -- 任务名称
local BUFF_DURATION = 30                             -- buff持续时间（秒）

-- 定义一个函数用于在每个周期内调整玩家的防水状态
local function OnTick(inst, target)
    -- 检查目标是否是玩家、是否有湿度组件且不是幽灵状态
    if target:HasTag("player") and target.components.moisture ~= nil and not target:HasTag("playerghost") then
        -- 设置玩家的湿度为0，提供100%防水效果
        target.components.moisture:SetMoistureLevel(0)
    else
        -- 如果目标不符合条件，停止debuff
        inst.components.debuff:Stop()
    end
end

-- 当buff附加到目标时调用
local function OnAttached(inst, target)
    -- 检查目标是否是玩家并且有湿度组件
    if target:HasTag("player") and target.components.moisture ~= nil then
        -- 将buff实体附加到目标实体上
        inst.entity:SetParent(target.entity)
        inst.Transform:SetPosition(0, 0, 0) -- 确保位置正确

        -- 如果已经存在相同的buff，重置持续时间
        if target.components.debuffable and target.components.debuffable:HasDebuff(BUFF_ID) then
            inst.components.timer:StopTimer(TIMER_NAME)
            inst.components.timer:StartTimer(TIMER_NAME, BUFF_DURATION)
            return
        end

        -- 设置一个定时任务，每秒调用一次OnTick函数
        inst[TASK_ID] = inst:DoPeriodicTask(1, OnTick, nil, target)
        -- 监听目标的死亡事件，如果目标死亡，停止debuff
        inst:ListenForEvent("death", function()
            inst.components.debuff:Stop()
        end, target)
    else
        -- 如果目标不符合条件，立即移除debuff
        inst:Remove()
    end
end

-- 当计时器完成时调用
local function OnTimerDone(inst, data)
    -- 检查计时器名称是否为TIMER_NAME
    if data.name == TIMER_NAME then
        -- 停止debuff
        inst.components.debuff:Stop()
    end
end

-- 当buff被延长时调用
local function OnExtended(inst, target)
    -- 检查目标是否是玩家并且有湿度组件
    if target:HasTag("player") and target.components.moisture ~= nil then
        -- 停止当前计时器并重新启动
        inst.components.timer:StopTimer(TIMER_NAME)
        inst.components.timer:StartTimer(TIMER_NAME, BUFF_DURATION) -- 设置持续时间为BUFF_DURATION

        -- 检查task是否存在
        if inst[TASK_ID] ~= nil then
            inst[TASK_ID]:Cancel()
        end
        -- 重新启动任务
        inst[TASK_ID] = inst:DoPeriodicTask(1, OnTick, nil, target)
    else
        -- 如果目标不符合条件，立即移除debuff
        inst:Remove()
    end
end

-- 定义buff的主要函数
local function fn()
    -- 创建一个新的实体
    local inst = CreateEntity()

    -- 如果不是主服务器，立即移除实体
    if not TheWorld.ismastersim then
        inst:DoTaskInTime(0, inst.Remove)
        return inst
    end

    -- 添加变换组件
    inst.entity:AddTransform()

    -- 隐藏实体，因为它不需要在网络中显示
    inst.entity:Hide()
    inst.persists = false -- 不需要持久化

    -- 添加一个标记以标识这是一个分类实体
    inst:AddTag("i26_buff")
    inst:AddTag("noblock")

    -- 添加debuff组件并设置相关函数
    inst:AddComponent("debuff")
    inst.components.debuff:SetAttachedFn(OnAttached) -- 设置附加函数
    inst.components.debuff:SetDetachedFn(inst.Remove) -- 设置分离函数
    inst.components.debuff:SetExtendedFn(OnExtended) -- 设置延长函数
    inst.components.debuff.keepondespawn = true -- 在消失时保持

    -- 添加计时器组件并启动计时器
    inst:AddComponent("timer")
    inst.components.timer:StartTimer(TIMER_NAME, BUFF_DURATION) -- 设置计时器为BUFF_DURATION
    inst:ListenForEvent("timerdone", OnTimerDone) -- 监听计时器完成事件

    return inst -- 返回实体
end

-- 返回一个新的Prefab，名称为BUFF_ID
return Prefab(BUFF_ID, fn)